package com.ftg.learn.day05.liner;

import java.util.Arrays;

/**
 * 我们自己完成的一个可以改变长度的数组
 *  jdk 写好了一些方法让你用吗
 *  1 : Arrays
 *
 * @author 布衣
 */
public class MyArray {

    private int[] array;
    private int size;

    /**
     * 第一次数组初始化
     */
    private void initArray(){
        if(null == array){
            array = new int[10];
        }
    }

    /**
     * 扩容
     */
    private void resize(){
        //存满了
        if(size == array.length){
            int newLength = array.length + (array.length >> 1);
            array = Arrays.copyOf(array,newLength);
        }
    }


    /**
     * 用来添加一个元素的方法
     * @param val 要添加的元素
     * @return true
     */
    public boolean add(int val){
        initArray();
        resize();
        array[size++] = val;
        return true;
    }

    /**
     * 用来删除一个元素的方法,根据指定的  index 做为索引 进行删除
     * @param index  索引 下标
     * @return  true;
     */
    public boolean remove(int index){

        if(index < 0 || index >= size){
            return false;
        }

        for(int i = index;i<size-1;i++){
            array[i] = array[i+1];
        }
        size--;
        return true;
    }

    /**
     * 在指定索引处插入一个元素。
     * 首先会检查索引是否有效，然后调整数组大小，将之后的元素依次后移，为新元素腾出空间。
     *
     * @param index 插入元素的索引位置。
     * @return 总是返回 true，表示插入操作成功。
     */
    public boolean insertElementAtIndex(int index){
        indexCheck(index); // 检查索引的有效性
        resize(); // 调整数组大小以容纳新元素

        // 将插入点之后的元素依次后移
        System.arraycopy(array,index,array,index+1,size-index);

        size++; // 数组元素数量加1
        return true;
    }


    private void indexCheck(int index){
        if(index < 0 || index >= size){
            throw new IndexOutOfBoundsException("yunmai-0001: 索引范围出现了错误!!!");
        }
    }


    /**
     * 修改方法
     * @param index 索引
     * @param newVal 新的数据
     * @return  true
     */
    public boolean modify(int index,int newVal){
        indexCheck(index);
        array[index] = newVal;
        return true;
    }

    /**
     * 用来获取元素的方法
     * @param index 索引
     * @return int
     */
    public int get(int index){
        indexCheck(index);
        return array[index];
    }

    /**
     * 获取数组的长度
     * @return int
     */
    public int size(){
        return size;
    }

//    dao : data  access  object

}
